{
 "metadata": {
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": 3
  },
  "orig_nbformat": 2
 },
 "nbformat": 4,
 "nbformat_minor": 2,
 "cells": [
  {
   "source": [
    "# C16. 测试"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 16.1 测试的概述\n",
    "\n",
    "测试驱动的编程：先测试，再编码。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.1.1 准确的需求说明\n",
    "\n",
    "开发软件时，必须先知道软件需要解决什么问题——实现的目标。编写需求说明"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.1.2 做好应对变化的准备\n",
    "\n",
    "代码覆盖率(coverage)：测试目标是确保较高的覆盖率，秉持测试驱动开发的理念。"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.1.3 测试四步曲\n",
    "\n",
    "1.  确定需要实现的新功能：记录下来，并为之编写一个测试\n",
    "2.  编写实现功能的框架代码，让程序能够运行(不存在语法错误之类的问题)，但是测试依然无法通过\n",
    "3.  编写让测试刚好能够通过的代码，无需实现所需要的功能。在整个开发阶段，都能够让所有的测试通过\n",
    "4.  改进(重构)代码以全面而且准确的实现所需要的功能，同时确保测试依然能够通过"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 16.2 测试的工具\n",
    "\n",
    "-   unittest：通用的测试框架\n",
    "-   doctest ：为检查文档而设计的测试框架，也适合用来编写单元测试"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.2.1 doctest\n",
    "\n"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.2.2 unittest"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 16.3 测试的扩展\n",
    "\n",
    "源代码检查 和 性能分析"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.3.1 PyChecker和PyLine检查源代码"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "### 16.3.2 profile 性能分析\n",
    "\n"
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "source": [
    "## 16.4 小结\n",
    "\n",
    "-   测试驱动编程：先测试再编码。有了测试，就能够放心地修改代码，使得开发和维护工具更加灵活\n",
    "-   模块 doctest 和 unittest：doctest 用于检查文档字符串中的示例，也可以用于测试套件。unitest 能够提供更加高级的测试套件方法\n",
    "-   PyChecker 和 PyLint：查看源代码并且指出潜在(和实际)的问题。检查代码的许多方面。\n",
    "-   性能分析：通过性能分析找出代码中的瓶颈"
   ],
   "cell_type": "markdown",
   "metadata": {}
  }
 ]
}